﻿using System;
using StackExchange.Redis;

namespace RedisDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("=== Redis Demo 开始 ===");

            // 获取Redis数据库实例
            IDatabase db = RedisHelper.GetDatabase();

            // 1. 字符串操作
            Console.WriteLine("\n[1] 字符串操作");
            db.StringSet("demo:string", "Hello Redis!");
            string stringValue = db.StringGet("demo:string");
            Console.WriteLine($"Key: demo:string, Value: {stringValue}");

            // 2. 哈希操作
            Console.WriteLine("\n[2] 哈希操作");
            db.HashSet("demo:hash", new HashEntry[]
            {
                new HashEntry("Name", "孙小同"),
                new HashEntry("Age", "25"),
                new HashEntry("Role", "Engineer")
            });
            Console.WriteLine($"Name: {db.HashGet("demo:hash", "Name")}");
            Console.WriteLine($"Age: {db.HashGet("demo:hash", "Age")}");

            // 3. 列表操作
            Console.WriteLine("\n[3] 列表操作");
            db.ListLeftPush("demo:list", "A");
            db.ListLeftPush("demo:list", "B");
            db.ListLeftPush("demo:list", "C");
            Console.WriteLine($"List Right Pop: {db.ListRightPop("demo:list")}");

            // 4. 集合操作
            Console.WriteLine("\n[4] 集合操作");
            db.SetAdd("demo:set", "value1");
            db.SetAdd("demo:set", "value2");
            db.SetAdd("demo:set", "value3");
            foreach (var member in db.SetMembers("demo:set"))
            {
                Console.WriteLine($"Set Member: {member}");
            }

            // 5. 有序集合操作
            Console.WriteLine("\n[5] 有序集合操作");
            db.SortedSetAdd("demo:sortedset", "Alice", 1);
            db.SortedSetAdd("demo:sortedset", "Bob", 2);
            db.SortedSetAdd("demo:sortedset", "Charlie", 3);
            foreach (var item in db.SortedSetRangeByRankWithScores("demo:sortedset"))
            {
                Console.WriteLine($"SortedSet Member: {item.Element}, Score: {item.Score}");
            }

            // 6. 发布与订阅
            Console.WriteLine("\n[6] 发布/订阅操作");
            ISubscriber sub = RedisHelper.GetSubscriber();

            // 订阅一个频道
            sub.Subscribe("demo:channel", (channel, message) =>
            {
                Console.WriteLine($"订阅者收到消息: {message}");
            });

            // 发布消息
            sub.Publish("demo:channel", "Hello Redis Pub/Sub!");

            // 等待一会，确保订阅消息被接收
            System.Threading.Thread.Sleep(1000);

            Console.WriteLine("\n=== Redis Demo 结束 ===");
            Console.ReadKey();
        }
    }
}
